#ifndef _TP1107_API_H_
#define _TP1107_API_H_

#include "stdio.h"
#include "tp1107_board.h"

#if (_NETWOK_MODLE_TYPE_ == _TP1107_MODULE_) && (_NETWOK_FUNCTION_ENABLE_)
/**
 * @brief 报文解析结果
 *
 */
typedef enum
{
  TP1107_PARSING_ERROR,            // 报文解析错误
  TP1107_PARSING_SUCCESS,          // 报文解析成功
  TP1107_PARSING_NO_KEYWORD_FOUND, // 没有找到关键字
} Tp1107MessageParsingResult_t;

/**
 * @brief 描述入网状态
 *
 */
typedef enum
{
  TP1107_JOINED,   // 已入网
  TP1107_JOINING,  // 正在入网
  TP1107_UNJOINED, // 未入网
} Tp1107NetworkAccessStatus_t;

/**
 * @brief 应答报文类型
 *
 */
typedef enum
{
  TP1107_RESPOND_AT,         // AT命令应答
  TP1107_RESPOND_HOST,       // 主机推送
  TP1107_RESPOND_ERROR,      // 错误提示
  TP1107_RESPOND_DEV_STATE,  // 设备状态
  TP1107_RESPOND_DISCONNECT, // 与服务器断开连接
} Tp1107MessageType_t;

/**
 * @brief 应答错误码
 *
 */
typedef struct
{
  uint8_t Code; // 错误码
} Tp1107ErrorCodeFormat_t;

/**
 * @brief 固件版本字段内容
 *
 */
typedef struct
{
  char HashValue[10];     // 哈希值
  char ModuleModel[10];   // 模组型号
  char ReleaseDate[10];   // 发布日期
  char VersionNumber[10]; // 版本号
} Tp1107VersionFormat_t;

/**
 * @brief 模组SN字段内容
 *
 */
typedef struct
{
  char Model[20]; // 模组型号
} Tp1107ModelNumberFormat_t;

/**
 * @brief UTC 时间
 *
 */
typedef struct
{
  uint16_t Year;  // 年
  uint8_t Month;  // 月
  uint8_t Date;   // 日
  uint8_t Hour;   // 时
  uint8_t Minute; // 分
  uint8_t Second; // 秒
} Tp1107UtcTimeFormat_t;

/**
 * @brief 链路状态字段内容
 *
 */
typedef struct
{
  int SNR;              // 信噪比
  int RSSI;             // 信号强度
  uint8_t LQI;          // 链接是否有效
  uint16_t RfChipError; // 射频芯片出错计数
} Tp1107LinkStatusFormat_t;

/**
 * @brief 入网模式
 *
 */
typedef struct
{
  uint8_t AccessMode; // 模式（true：自动入网 false：手动入网）
} Tp1107AccessModeFormat_t;

/**
 * @brief 频点信息字段内容
 *
 */
typedef struct
{
  float UplinkFrequency;   // 上行频率
  float DownlinkFrequency; // 下行频率
} Tp1107FrequencyFormat_t;

/**
 * @brief 构建进入命令下发模式报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildEnteringCommandModeMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建退出命令下发模式报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildExitingCommandModeMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询固件版本报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildQueryFirmwareVersionNumberMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询模组 ESN 报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildQueryModuleESNMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建获得当前时间报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildGetUTCTimeMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建重启模组报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildModuleRebootMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建恢复出厂设置报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildFactoryResetMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建当前链路状态报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildGetCurrentLinkStateMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询入网模式配置报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildQueryEntryModeConfigurationMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建配置入网模式报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @param En       - 入网模式（true：自动入网 false：手动入网）
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildConfiguringAdmissionModeMessage(void *pDataOut, uint16_t *pSizeOut, bool En);

/**
 * @brief 构建查询入网状态报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildCheckingNetworkstatusMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建手动入网报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildAccessNetworkMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建数据发送报文
 *
 * @param pDataOut    - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 发送数据有效长度
 * @param pDataPacket -
 * @param PacketSize  -
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildDataTransmissionMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t *pDataPacket, uint16_t PacketSize);

/**
 * @brief 构建查询当前使用频点信息报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildQueryCurrentFrequencyInformationMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建网络搜索超时时间配置报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @param Timeout  - 搜索超时时间
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildSearchNetworkTimeoutMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t Timeout);

/**
 * @brief 构建发送超时时间配置报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @param Timeout  - 发送超时时间
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildConfigureSendTimeoutMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t Timeout);

/**
 * @brief 构建配置自适应发射功率功能报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @param En       - 使能位（true：使能 false：失能）
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildConfiguringAdaptiveEmissionPowerMessage(void *pDataOut, uint16_t *pSizeOut, bool En);

/**
 * @brief 构建发射功率配置报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @param Power    - 发射功率
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildConfiguringEmissionPowerMessage(void *pDataOut, uint16_t *pSizeOut, int Power);

/**
 * @brief 构建自动扫描下行频点功报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @param En       - 使能位（true：使能 false：失能）
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildAutoFrequencyScanningMessage(void *pDataOut, uint16_t *pSizeOut, bool En);

/**
 * @brief 构建配置工作频率报文
 *
 * @param pDataOut  - 指向待发送数据地址的指针变量
 * @param pSizeOut  - 发送数据有效长度
 * @param Frequency - 工作频率
 * @return bool     - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildConfiguringWorkingFrequencyMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t Frequency);

/**
 * @brief 构建配置频点扫描范围报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @param Value    - 扫描范围（输入范围1、3、7、15）
 * @return bool     - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildConfiguringFrequencyScanningRangeMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t Value);

/**
 * @brief 构建配置入网信号阀值报文
 *
 * @param pDataOut  - 指向待发送数据地址的指针变量
 * @param pSizeOut  - 发送数据有效长度
 * @param Threshold - 信号阀值
 * @return bool     - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildConfiguringNetworkSignalThresholdMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t Threshold);

/**
 * @brief 验证数据有效性
 *
 * @param pDataIn    - 待验证得数据流
 * @param DataSize   - 数据长度
 * @return uint8_t   - 报文类型
 */
extern uint8_t Tp1107AuthenticationMessageType(const void *pDataIn, uint16_t DataSize);

/**
 * @brief 解析进入命令下发模式报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingEnteringCommandModeMessage(const void *pDataIn);

/**
 * @brief 解析退出命令下发模式报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingExitingCommandModeMessage(const void *pDataIn);

/**
 * @brief 解析查询固件版本报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @param pVersionNumber                - 版本号
 * @param pReleaseDate                  - 发布日期
 * @param pHashValue                    - 哈希值
 * @param pModuleModel                  - 模组型号
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingQueryFirmwareVersionNumberMessage(const void *pDataIn, char *pVersionNumber, char *pReleaseDate, char *pHashValue, char *pModuleModel);

/**
 * @brief 解析查询模组 ESN 报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @param pModule                       - 设备SN
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingQueryModuleESNMessage(const void *pDataIn, char *pModule);

/**
 * @brief 解析获得当前时间报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @param pYear                         - 年
 * @param pMonth                        - 月
 * @param pDate                         - 日
 * @param pHour                         - 时
 * @param pMinute                       - 分
 * @param pSecond                       - 秒
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingGetUTCTimeMessage(const void *pDataIn, uint16_t *pYear, uint8_t *pMonth, uint8_t *pDate, uint8_t *pHour, uint8_t *pMinute, uint8_t *pSecond);

/**
 * @brief 解析重启模组报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingModuleRebootMessage(const void *pDataIn);

/**
 * @brief 解析恢复出厂设置报文有效性
 * 
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingFactoryResetMessage(const void *pDataIn);

/**
 * @brief 解析当前链路状态报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @param pRSSI                         - 信号强度
 * @param pLQI                          - 链接是否有效
 * @param pSNR                          - 信噪比
 * @param pRfChipError                  - 射频芯片出错计数
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingGetCurrentLinkStateMessage(const void *pDataIn, int *pRSSI, uint8_t *pLQI, int *pSNR, uint16_t *pRfChipError);

/**
 * @brief 解析查询入网模式配置报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @param pAccessMode                   - 入网模式（true：自动入网 false：手动入网）
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingQueryEntryModeConfigurationMessage(const void *pDataIn, uint8_t *pAccessMode);

/**
 * @brief 解析配置入网模式报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingConfiguringAdmissionModeMessage(const void *pDataIn);

/**
 * @brief 解析查询入网状态报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @param pAccessStatus                 - 驻网状态
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingCheckingNetworkstatusMessage(const void *pDataIn, uint8_t *pAccessStatus);

/**
 * @brief 解析手动入网报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingAccessNetworkMessage(const void *pDataIn);

/**
 * @brief 构建数据发送报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingDataTransmissionMessage(const void *pDataIn);

/**
 * @brief 构建查询当前使用频点信息报文有效性
 *
 * @param pDataIn                       - 待解析的数据
 * @param pUplinkFrequency              - 上行频率
 * @param pDownlinkFrequency            - 下行频率
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingQueryCurrentFrequencyInformationMessage(const void *pDataIn, float *pUplinkFrequency, float *pDownlinkFrequency);

/**
 * @brief 解析发送超时时间配置报文
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107PrasingSearchNetworkTimeoutMessage(const void *pDataIn);

/**
 * @brief 解析发送超时时间配置报文
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingConfigureSendTimeoutMessage(const void *pDataIn);

/**
 * @brief 解析配置自适应发射功率功能报文
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingConfiguringAdaptiveEmissionPowerMessage(const void *pDataIn);

/**
 * @brief 解析发射功率配置报文
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingConfiguringEmissionPowerMessage(const void *pDataIn);

/**
 * @brief 解析自动扫描下行频点功报文
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingAutoFrequencyScanningessage(const void *pDataIn);

/**
 * @brief 解析配置工作频率报文
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingConfiguringWorkingFrequencyMessage(const void *pDataIn);

/**
 * @brief 解析配置频点扫描范围报文
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingConfiguringFrequencyScanningRangeMessage(const void *pDataIn);

/**
 * @brief 解析配置入网信号阀值报文
 *
 * @param pDataIn                       - 待解析的数据
 * @return Tp1107MessageParsingResult_t - 解析状态
 */
extern Tp1107MessageParsingResult_t Tp1107ParsingConfiguringNetworkSignalThresholdMessage(const void *pDataIn);

#endif
#endif
